﻿#ifndef POST_NEARFIELDDATAGENERATOR_H
#define POST_NEARFIELDDATAGENERATOR_H

#include <QObject>
#include <QList>
#include <vtkSmartPointer.h>

class vtkTable;
class vtkPointSet;
class vtkStructuredGrid;

namespace pst
{
    class NearFieldDataGenerator : public QObject
    {
        Q_OBJECT

    public:
        NearFieldDataGenerator(QObject* parent = nullptr);
        ~NearFieldDataGenerator();

    public:

        void setInputData(vtkTable* table);

        void setLogTheData(bool useLog);
        bool getLogTheData();

        void setNormalizeTheData(bool useNormalize);
        bool getNormalizeTheData();

        //sliceAxis -1:整个表，0:x轴，1:y轴，2:z轴
        void setDataExtraction(int sliceAxis, int sliceValue = 0);
        void getDataExtraction(int& sliceAxis, int& sliceValue);

        bool update(int valueValueIndex);

        //获取法线沿x轴变化的切片数值
        QList<double> GetXSlicePositionEnum();
        QList<double> GetYSlicePositionEnum();
        QList<double> GetZSlicePositionEnum();
        QString GetXSlicePositionUnit();
        QString GetYSlicePositionUnit();
        QString GetZSlicePositionUnit();

        vtkStructuredGrid* getOutputData(); // get the vtkDataSiz

        //void SetLogCoefficients(double factory);

        vtkSmartPointer<vtkTable> getResultTable();

        // json中的文件类型result_type
        void setFileDealType(int type);
        int getFileDealType();

    private:
        vtkSmartPointer<vtkStructuredGrid> ConvertTableToStructuredGrid(vtkTable* table);
        /// @brief 将表格转为StructuredGrid(表面重建)
        /// @param inputTable 输入的4列直角坐标表格
        /// @param outStructuredGrid 表面重建后的数据
        void transformTableToStructuredGrid(vtkTable* inputTable,
            vtkStructuredGrid* outStructuredGrid, int xMax, int yMax, int zMax, bool reverseXYZ);

        /// @brief 对表格取对数（只对选定列取对数）
        /// @param inputTable 输入表格
        /// @param outputTable 输出表格
        /// @param logedMinimalValue 取对数后的最小值
        /// @param valueValueIndex 取对数的那一列
        void logTheTable(vtkTable* inputTable, vtkTable* outputTable, double& logedMinimalValue, int valueValueIndex);

        //对所有值列都进行归一化
        void normalizeTheTable(vtkTable* inputTable, vtkTable* outputTable);

        QList<QList<double>> computeTableExtends(vtkTable* inputTable);

        void extractDataFromTable(const vtkSmartPointer<vtkTable>& table,
            QList<double>& xList, QList<double>& yList, QList<double>& zList,
            QList<vtkSmartPointer<vtkTable>>& extractedXRows,
            QList<vtkSmartPointer<vtkTable>>& extractedYRows,
            QList<vtkSmartPointer<vtkTable>>& extractedZRows);

        vtkTable* extractTable(bool& isOk);

        void decideLogCoefficients();

        /// @brief 将表格的x,y,z列转换为毫米单位
        bool convertKeyColumnsUnitToMM(vtkTable* originalTable);

        void UnitConversionToMM(const QString& unit, double& value);

    private:
        bool m_useLog;
        bool m_useNormalize;
        double m_logFactory;
        vtkTable* m_originalTable;
        vtkSmartPointer<vtkTable> m_resultTable;
        vtkSmartPointer<vtkStructuredGrid> m_resultDataSet;
        //QList<QList<double>> m_sliceEnums;//有哪些不同的x,y,z
        bool m_inverserXYZ;


        QList<double> m_xList;
        QList<double> m_yList;
        QList<double> m_zList;
        QString xSlicePositionUnit;
        QString ySlicePositionUnit;
        QString zSlicePositionUnit;
        QList<vtkSmartPointer<vtkTable>> m_extractedXTables;
        QList<vtkSmartPointer<vtkTable>> m_extractedYTables;
        QList<vtkSmartPointer<vtkTable>> m_extractedZTables;
        bool m_isDataExtracted;

        //sliceAxis -1:整个表，0:x轴，1:y轴，2:z轴
        int m_sliceAxis;
        int m_sliceValueIndex;

        // json中的文件类型result_type
        // 是文件的类型
        // 体电场分布（0）面电场分布（1） 点电场（探针点）（2） 表面场分布（3）表面电流密度（4） 空间电势分布（5）
        // 表面电势分布（6） 方向图（7）  S参数（8）  驻波比（9）  电压（10）
        // 电流（11） 附着点路径（14）   面电势分布（15） 干扰关联矩阵（12）  SAR（13）
        int m_fileDealType;
    };
}
#endif // NearFieldDataGenerator
